一.IO流概述
  I:Input : 从硬盘上读取数据到java程序(内存)  硬盘=>内存
  O:Output: 将java程序中的数据写入到硬盘   内存=>硬盘
二.IO体系
  1.字节流体系
	a.OutputStream:字节输出(写入)流
		FileOutputStream:将数据写入文件
		 a.构造方法
			/**
			 * FileOutputStream类:
			 *   构造方法
			 *     FileOutputStream(String name)
			 *           name:传入一个文件路径
			 *           1.如果传入的文件路径在硬盘不存在,那么该构造方法会抛出java.io.FileNotFoundException
			 *           2.如果传入的文件路径在硬盘存在而且该路径下没有该文件,那么该构造方法会为我们创建一个空白文件
			 *           3.如果传入的文件路径在硬盘存在但是该路径下已有该文件,那么该构造方法会清空该文件内容
			 *
			 *           创建一个向具有指定名称的文件中写入数据的输出文件流。
			 *   成员方法:
			 *    void write(int b)
			 *              将指定字节写入此文件输出流。
			 *    void close()
			 *  *           关闭此文件输出流并释放与此流有关的所有系统资源。
			 * 通过FileOutputStream向文件中写内容的步骤:
			 *   1.通过输出流关联一个文件1.txt
			 *   2.通过write方法向1.txt中写字节
			 *   3.关流释放资源
			 *   注意:写动作一定是在close之前,因为close关流后,底层IO资源已经释放,无法在使用
			 *
			 */

		 b.成员方法
		/**
		 *  FileOutputStream成员方法:
		 *    void write(byte[] b)
		 *           将 b.length 个字节从指定 byte 数组写入此文件输出流中。
		 *    void write(byte[] b, int off, int len)
		 *            将指定的字节数组(b),从off索引开始,写入len个字节(包含off索引处的字节)
		 * String类中的方法
		 *  byte[] getBytes()
		 *           使用平台的默认字符集将此 String 编码为 byte 序列，并将结果存储到一个新的 byte 数组中。
		 */
		c.续写和写入换行

		/**FileOutputStream构造方法:
		 *  FileOutputStream(String name, boolean append)
		 *           当第二个参数为true的时候write会不断的往文件末尾追加
		 *           当第二个参数为false的时候,每次执行构造方法都会清空文件内容
		 *
		 *  如果想让文件中的内容换行,我们需要向文件中写入换行符
		 *  不同操作系统换行符也不同
		 *  windows:\r\n
		 *  linux:\n
		 *  mac os:\r
		 */
	b.InputStream:字节输入(读取)流
		FileInputStream:
		  a.构造方法
			/**
			 * FileInputStream构造方法
			 *     FileInputStream(String name)
			 *      FileInputStream读取硬盘上已经存在的文件,如果文件不存在那么抛出FileNotFoundException
			 *  成员方法:
			 *   int read()
			 *           从此输入流中读取一个数据字节。
			 *    void close()
			 *           关闭此文件输入流并释放与此流有关的所有系统资源。
			 */
          b.成员方法
			/**
			 * FileInputStream成员方法
			 *   int read(byte[] b)
			 *           1.从文件中读取尽可能多的字节,装到字节数组中去,0索引存放文件中的第一个字节,1索引存放文件中的第二个字节,以此类推
			 *           2.返回值代表每次从文件中读取的字节个数
			 * String类的构造方法
			 *   String(byte[] bytes)
			 *           通过使用平台的默认字符集解码指定的 byte 数组，构造一个新的 String
			 */

		  c.拷贝文件案例
		    /**
		    * 利用字节数组拷贝风景.jpg
		    * 利用字节输入流和字节输出流可以拷贝计算机中任意文件,因为计算机中所有的文件都是以字节形式存储的
		    */
      c.高效字节输出流
		/**
		 * BufferedOutputStream类:
		 *    该类实现缓冲的输出流,缓冲的目的就是为了提高写效率
		 * 构造方法:
		 * BufferedOutputStream(OutputStream out)
		 *           创建一个新的缓冲输出流，以将数据写入指定的底层输出流。
		 * 成员方法:
		 *  void flush()
		 *           刷新此缓冲的输出流。
		 *
		 * public void write(byte[] b)
		 *          将 b.length 个字节写入此输出流。
		 *  void write(byte[] b, int off, int len)
		 *           将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
		 *  void write(int b)
		 *           将指定的字节写入此缓冲的输出流。
		 *  BufferedOutputStream原理:
		 *      它底层其实会开辟一个默认长度为8192字节数组,为了提高写效率
		 *      但是我们write()方法会把字节写入到底层字节数组中,只有通过刷新或关流,才能将字节数组中的字节刷到文件中去
		 */
       d.高效字节输入流
		  /*
		* BufferedInputSteam
		*  构造方法:
		*    BufferedInputStream(InputStream in)
		          创建一个 BufferedInputStream 并保存其参数，即输入流 in，以便将来使用。
		      int read()
		          参见 InputStream 的 read 方法的常规协定。
		      public int read(byte[] b)
		         throws IOException从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中。在某些输入可用之前，此方法将阻塞。

		     BufferedInputSteam底层也会开辟一个默认长度为8192的字节数组,将来读到数据都会存储到这个字节数组中去
		* */
  2.字符流体系